/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.Obra;
import bean.Significado;
import bean.Verbete;
import java.io.Serializable;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author jorge
 */
public class VerbeteDao implements Serializable {

    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;

    public VerbeteDao() {
        this.conexao = new ConexaoPostgres();

    }

    public Verbete consultarVerbete(Verbete verbete) {

        try {
            ps = conexao.getConnection().prepareStatement("Select * from verbete where verbete = ? ");
            ps.setString(1, verbete.getTitulo());

            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            if (rs.next()) {
                System.out.println("Verbete Dao - Descobrir id Verbete - Encontrado! = ");
                verbete.setId(rs.getInt("id"));
                ObraDao od = new ObraDao();
                verbete.setSugestaoLeitura1(od.consultaObra(rs.getInt("sugestao_leitura1")));
                verbete.setSugestaoLeitura1(od.consultaObra(rs.getInt("sugestao_leitura2")));
                verbete.setSugestaoLeitura1(od.consultaObra(rs.getInt("sugestao_leitura3")));
                verbete.setTitulosAlternativo1(rs.getString("nome_alternativo1"));
                verbete.setTitulosAlternativo1(rs.getString("nome_alternativo2"));
                verbete.setTitulosAlternativo1(rs.getString("nome_alternativo3"));

                return verbete;

            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            verbete.setId(-1);
            return verbete;

        }
        System.out.println("Verbete Dao - Descobrir id verbete - Não encontrou o verbete!");

        verbete.setId(-1); //-1 codigo para livro não encontrado!
        conexao.closeConnection();
        return verbete;
    }
    
    public boolean validarVerbeteJaCadastrado(Verbete v) {
        System.out.println("Validados de Verbete já cadastrado executado!");
        PreparedStatement ps = null;
        
        try {
            ps = conexao.getConnection().prepareStatement("SELECT * from verbete WHERE verbete ~* ? ");
            
            ps.setString(1, v.getTitulo());
            
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            if(rs.next()){
                System.out.println("Já cadastrado! Return false");
                conexao.closeConnection();
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(AutorDao.class.getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
        }
       
        conexao.closeConnection();
        System.out.println("Não encontrei: return true ");
        return true;
    }

    public boolean cadastrarNovoVerbete(Verbete verbete) {
        sucess = false;

        try {
            System.out.println("Cadastro Verbete: ");



            ps = conexao.getConnection().prepareStatement("INSERT INTO verbete (verbete, sugestao_leitura1, sugestao_leitura2, sugestao_leitura3, nome_alternativo1, nome_alternativo2, nome_alternativo3) VALUES (?, ?, ?, ?, ?, ?, ?) ");

            ps.setString(1, verbete.getTitulo());
            ps.setInt(2, verbete.getSugestaoLeitura1().getId());
            ps.setInt(3, verbete.getSugestaoLeitura2().getId());
            ps.setInt(4, verbete.getSugestaoLeitura3().getId());
            ps.setString(5, verbete.getTitulosAlternativo1());
            ps.setString(6, verbete.getTitulosAlternativo2());
            ps.setString(7, verbete.getTitulosAlternativo3());


            ps.executeUpdate();
            conexao.closeConnection();

            verbete = this.consultarVerbete(verbete);
            System.out.println("Cadastrar Verbete - Id verbete:" + verbete.getId());
            if ((verbete.getId() != -1) && (verbete.getId() != 0)) { //-1 indica que por algum motivo ao consultar não foi encontrado o livro

                Iterator iov = verbete.getObrasRelacionadas().iterator();
                while (iov.hasNext()) {
                    ps = conexao.getConnection().prepareStatement("INSERT INTO verbete_obra (id_obra, id_verbete) VALUES (?, ?) ");
                    Obra obra = (Obra) iov.next();
                    ps.setInt(1, obra.getId());
                    ps.setInt(2, verbete.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }

                Iterator i = verbete.getSignificados().iterator();
                while (i.hasNext()) {
                    ps = conexao.getConnection().prepareStatement("INSERT INTO significado (significado, data) VALUES (?, ?) ");
                    Significado significado = (Significado) i.next();
                    ps.setString(1, significado.getSignificado());
                    Date data = new Date(significado.getData().getTime());
                    ps.setDate(2, data);

                    ps.executeUpdate();
                    conexao.closeConnection();

                    SignificadoDao sd = new SignificadoDao();
                    significado.setId(sd.consultarSignificado(significado).getId());

                    ps = conexao.getConnection().prepareStatement("INSERT INTO verbete_significado (id_verbete, id_significado) VALUES (?, ?) ");
                    ps.setInt(1, verbete.getId());
                    ps.setInt(2, significado.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();


                    Iterator it = significado.getAutores().iterator();
                    int posicao = 1;
                    while (it.hasNext()) {
                        ps = conexao.getConnection().prepareStatement("INSERT INTO significado_autor (id_autor, id_significado, posicao) VALUES ( ?, ?, ?) ");
                        Autor a = (Autor) it.next();

                        ps.setInt(1, a.getId());
                        ps.setInt(2, significado.getId());
                        ps.setInt(3, posicao);
                        posicao++;
                        ps.executeUpdate();
                        conexao.closeConnection();
                    }

                }

            }
            conexao.closeConnection();
            sucess = true;

        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public boolean alterarVerbete(Verbete verbete) {

        sucess = false;

        try {
            System.out.println("Verbete Dao - Alteração Verbete: ");
            System.out.println("Palavra: " + verbete.getTitulo());


            ps = conexao.getConnection().prepareStatement("UPDATE verbete SET verbete = ?, sugestao_leitura1 = ?, sugestao_leitura2 = ?, sugestao_leitura3 = ?, nome_alternativo1 = ?, nome_alternativo2 = ? , nome_alternativo3 = ? WHERE id = ?");
            ps.setString(1, verbete.getTitulo());
            ps.setInt(2, verbete.getSugestaoLeitura1().getId());
            ps.setInt(3, verbete.getSugestaoLeitura2().getId());
            ps.setInt(4, verbete.getSugestaoLeitura3().getId());
            ps.setString(5, verbete.getTitulosAlternativo1());
            ps.setString(6, verbete.getTitulosAlternativo2());
            ps.setString(7, verbete.getTitulosAlternativo3());
            ps.setInt(8, verbete.getId());

            ps.executeUpdate();
            conexao.closeConnection();

            sucess = true;

        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public List<Verbete> consultarVerbetes(String palavra) {
        System.out.println("VerbeteDao - ConsultaVerbete - Palavra Pesquisada: " + palavra);
        palavra = palavra + '%';
        ArrayList<Verbete> resultadoConsulta = new ArrayList<Verbete>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT * FROM verbete WHERE verbete ILIKE ? or nome_alternativo1 ILIKE ? or nome_alternativo2 ILIKE ? or nome_alternativo3 ILIKE ?  ; ");
            ps.setString(1, palavra);
            ps.setString(2, palavra);
            ps.setString(3, palavra);
            ps.setString(4, palavra);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            
            while(rs.next()){
                
                Verbete verbete = new Verbete();

                verbete.setId(rs.getInt("id"));
                verbete.setTitulo(rs.getString("verbete"));
                ObraDao od = new ObraDao();
                verbete.setSugestaoLeitura1(od.consultaObra(rs.getInt("sugestao_leitura1")));
                verbete.setSugestaoLeitura2(od.consultaObra(rs.getInt("sugestao_leitura2")));
                verbete.setSugestaoLeitura3(od.consultaObra(rs.getInt("sugestao_leitura3")));
                verbete.setTitulosAlternativo1(rs.getString("nome_alternativo1"));
                verbete.setTitulosAlternativo2(rs.getString("nome_alternativo2"));
                verbete.setTitulosAlternativo3(rs.getString("nome_alternativo3"));

                verbete.getObrasRelacionadas().addAll(this.buscarObras(verbete));
                verbete.getSignificados().addAll(this.buscarSignificados(verbete));
                resultadoConsulta.add(verbete);
                
            }
        } catch (SQLException ex) {
            Logger.getLogger(VerbeteDao.class.getName()).log(Level.SEVERE, null, ex);
            this.conexao.closeConnection();
        }
        
        return resultadoConsulta;
    }
    
    public List<Verbete> listarVerbetes() {
        List<Verbete> verbetes = new ArrayList<Verbete>();
        try {
            System.out.println("Fui Executado: Verbete Dao  - listarVerbetes");
            ps = conexao.getConnection().prepareStatement("SELECT * FROM verbete;");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            while (rs.next()) {
                Obra obra = new Obra();
                Verbete verbete = new Verbete();

                verbete.setId(rs.getInt("id"));
                verbete.setTitulo(rs.getString("verbete"));
                ObraDao od = new ObraDao();
                verbete.setSugestaoLeitura1(od.consultaObra(rs.getInt("sugestao_leitura1")));
                verbete.setSugestaoLeitura2(od.consultaObra(rs.getInt("sugestao_leitura2")));
                verbete.setSugestaoLeitura3(od.consultaObra(rs.getInt("sugestao_leitura3")));
                verbete.setTitulosAlternativo1(rs.getString("nome_alternativo1"));
                verbete.setTitulosAlternativo2(rs.getString("nome_alternativo2"));
                verbete.setTitulosAlternativo3(rs.getString("nome_alternativo3"));

                verbete.getObrasRelacionadas().addAll(this.buscarObras(verbete));
                verbete.getSignificados().addAll(this.buscarSignificados(verbete));
                verbetes.add(verbete);

            }
        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger
                    .getLogger(InstituicaoDao.class
                    .getName()).log(Level.SEVERE, null, ex);
        }


        this.conexao.closeConnection();

        return verbetes;

    }

    public ArrayList<Obra> buscarObras(Verbete verbete) {

        ArrayList<Obra> obras = new ArrayList<Obra>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id_obra FROM verbete_obra WHERE id_verbete = ? ;");
            System.out.println("VerbeteDao - BuscaObras - Fui Executado");
            System.out.println("Id verbete: " + verbete.getId());
            ps.setInt(1, verbete.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            ObraDao od = new ObraDao();

            while (rs.next()) {

                Obra o = new Obra();
                o = od.consultaObra(rs.getInt("id_obra"));
                System.out.println(o.getTitulo() + o.getTipo());
                obras.add(o);




            }
        } catch (SQLException ex) {
            Logger.getLogger(VerbeteDao.class
                    .getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
        }
        conexao.closeConnection();
        return obras;

    }

    public ArrayList<Significado> buscarSignificados(Verbete verbete) {

        ArrayList<Significado> significados = new ArrayList<Significado>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id_significado FROM verbete_significado WHERE id_verbete = ? ;");
            System.out.println("VerbeteDao - BuscaSignificados - Fui Executado");
            System.out.println("Id verbete: " + verbete.getId());
            ps.setInt(1, verbete.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            SignificadoDao sd = new SignificadoDao();

            while (rs.next()) {

                Significado s = new Significado();
                s.setId(rs.getInt("id_significado"));
                s = sd.consultarSiginificadoID(rs.getInt("id_significado"));
                System.out.println("VerbeteDao = buscaSignificado: " + s.getSignificado() + s.getId());
                significados.add(s);




            }
        } catch (SQLException ex) {
            Logger.getLogger(VerbeteDao.class
                    .getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
        }
        conexao.closeConnection();
        return significados;

    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }

    public PreparedStatement getPs() {
        return ps;
    }

    public void setPs(PreparedStatement ps) {
        this.ps = ps;
    }

    public boolean isSucess() {
        return sucess;
    }

    public void setSucess(boolean sucess) {
        this.sucess = sucess;
    }
}
